package api

import (
	. "im/internal/common"
	"im/internal/model"
	"im/internal/service"
	"strconv"

	"github.com/gin-gonic/gin"
)

// ApplyToAddFriend
// @Summary 申请添加好友
// @Description 所有用户都可以发起好友申请
// @Tags friend
// @Accept json
// @Produce json
// @Param user_id query string true "好友id"
// @Param remark query string true "申请消息"
// @Success 200 {object} Result{} "发送成功"
// @Router /apply_to_add_friend [get]
func ApplyToAddFriend(c *gin.Context) {
	userId, err := strconv.Atoi(c.Query("user_id"))
	remark := c.Query("remark")
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	err = service.ApplyToAddFriend(auth.Id, userId, remark)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success"))
}

type respondFriendApplyForm struct {
	ApplyId int  `form:"apply_id" binding:"required"`
	Agree   bool `form:"agree"`
}

// RespondFriendApply
// @Summary 回应好友申请
// @Description 只有申请接收者可以处理申请
// @Tags friend
// @Accept json
// @Produce json
// @Param apply_id formData number true "申请id"
// @Param agree formData boolean true "是否同意"
// @Success 200 {object} Result{} "发送成功"
// @Router /respond_friend_apply [post]
func RespondFriendApply(c *gin.Context) {
	form := respondFriendApplyForm{}
	err := c.Bind(&form)
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	var agree int8
	if form.Agree {
		agree = 1
	} else {
		agree = -1
	}
	ok, err := service.RespondFriendApply(auth.Id, form.ApplyId, agree)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"agree": ok,
	}))
}

// DeleteFriend
// @Summary 删除好友关系
// @Description 只能删除自己的好友关系
// @Tags friend
// @Accept json
// @Produce json
// @Param friend_id formData number true "好友id"
// @Success 200 {object} Result{} "发送成功"
// @Router /delete_friend [delete]
func DeleteFriend(c *gin.Context) {
	friendId, err := strconv.Atoi(c.PostForm("friend_id"))
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	err = service.DeleteFriend(auth.Id, friendId)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success"))
}

type remarkForm struct {
	FriendId int    `form:"friend_id" binding:"required"`
	Remark   string `form:"remark"`
}

// SetFriendRemark
// @Summary 设置好友备注
// @Description 只能设置自己好友的备注
// @Tags friend
// @Accept json
// @Produce json
// @Param user_id formData number true "好友id"
// @Param remark formData string true "好友备注名"
// @Success 200 {object} Result{} "发送成功"
// @Router /set_friend_remark [post]
func SetFriendRemark(c *gin.Context) {
	form := remarkForm{}
	err := c.Bind(&form)
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	remark, err := service.SetFriendRemark(auth.Id, form.FriendId, form.Remark)
	if err != nil {
		Response(Error(err.Error()))
	}
	if !remark {
		Response(Error("error"))
	}
	Response(Success("success"))
}

// AddBlock
// @Summary 添加黑名单
// @Description 只能将用户加入自己的黑名单
// @Tags friend
// @Accept json
// @Produce json
// @Param friend_id formData number true "用户id"
// @Success 200 {object} Result{} "发送成功"
// @Router /add_block [post]
func AddBlock(c *gin.Context) {
	friendId, err := strconv.Atoi(c.PostForm("friend_id"))
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	err = service.AddBlock(auth.Id, friendId)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success"))
}

// RemoveBlock
// @Summary 移除黑名单
// @Description 只能从自己的黑名单移除用户
// @Tags friend
// @Accept json
// @Produce json
// @Param friend_id formData number true "好友id"
// @Success 200 {object} Result{} "发送成功"
// @Router /remove_block [delete]
func RemoveBlock(c *gin.Context) {
	friendId, err := strconv.Atoi(c.PostForm("friend_id"))
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	err = service.RemoveBlock(auth.Id, friendId)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success"))
}

// ImportFriends 批量导入好友
func ImportFriends() {

}

// GetFriendInfo
// @Summary 获取好友信息
// @Description 只能查看自己的好友信息
// @Tags friend
// @Accept json
// @Produce json
// @Param friend_id query number true "好友id"
// @Success 200 {object} Result{} "发送成功"
// @Router /get_friend_info [get]
func GetFriendInfo(c *gin.Context) {
	friendId, err := strconv.Atoi(c.Query("friend_id"))
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	info, err := service.GetFriendInfo(auth.Id, friendId)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"userinfo": info,
	}))
}

// GetPaginationFriends 分页获取好友列表
func GetPaginationFriends(c *gin.Context) {

}

// GetDesignatedFriends
// @Summary 获取指定好友信息
// @Description 查看指定好友的详细信息 , 与 GetFriendInfo 区别是复数
// @Tags friend
// @Accept json
// @Produce json
// @Param ids query []number true "好友ids"
// @Success 200 {object} Result{} "发送成功"
// @Router /get_designated_friends [get]
func GetDesignatedFriends(c *gin.Context) {
	friendIds := c.QueryArray("ids")
	auth := c.MustGet("auth").(*model.User)
	var ids []int
	//转为整形 , 排除自身
	for _, str := range friendIds {
		if val, err := strconv.Atoi(str); err == nil {
			if auth.Id == val {
				continue
			}
			ids = append(ids, val)
		}
	}
	if len(ids) == 0 {
		Response(Error("参数错误"))
	}
	friends, err := service.GetDesignatedFriends(auth.Id, ids)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"list": friends,
	}))
}

// IsFriend
// @Summary 检查好友关系
// @Description 检查双向好友关系状态
// @Tags friend
// @Accept json
// @Produce json
// @Param user_id query string true "用户id"
// @Success 200 {object} Result{} "发送成功"
// @Router /is_friend [get]
func IsFriend(c *gin.Context) {
	userId, err := strconv.Atoi(c.Query("user_id"))
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	friend, err := service.IsBothFriend(auth.Id, userId)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"friend": friend,
	}))
}

// GetFriendIDs
// @Summary 获取好友ID列表
// @Description 获取用户的所有好友ID
// @Tags friend
// @Accept json
// @Produce json
// @Success 200 {object} Result{} "发送成功"
// @Router /get_friend_ids [get]
func GetFriendIDs(c *gin.Context) {
	auth := c.MustGet("auth").(*model.User)
	ids, err := service.GetFriendIDs(auth.Id)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"ids": ids,
	}))
}

// GetPaginationFriendsApplyTo
// @Summary 获取列表
// @Description 获取发送的申请列表
// @Tags friend
// @Accept json
// @Produce json
// @Success 200 {object} Result{} "发送成功"
// @Router /get_pagination_friends_apply_to [get]
func GetPaginationFriendsApplyTo(c *gin.Context) {
	auth := c.MustGet("auth").(*model.User)
	list, err := service.GetPaginationFriendsApplyTo(auth.Id, []int{-1, 0, 1})
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"list": list,
	}))
}

// GetPaginationFriendsApplyFrom
// @Summary 获取申请
// @Description 获取申请接收到的好友申请列表
// @Tags friend
// @Accept json
// @Produce json
// @Success 200 {object} Result{} "发送成功"
// @Router /get_pagination_friends_apply_from [get]
func GetPaginationFriendsApplyFrom(c *gin.Context) {
	auth := c.MustGet("auth").(*model.User)
	list, err := service.GetPaginationFriendsApplyFrom(auth.Id, []int{1})
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"list": list,
	}))
}

// GetPaginationBlacks 分页获取黑名单
func GetPaginationBlacks(c *gin.Context) {

}

// IsBlock
// @Summary 检查黑名单状态
// @Description 检查用户是否在黑名单中
// @Tags friend
// @Accept json
// @Produce json
// @Param user_id query string true "用户id"
// @Success 200 {object} Result{} "发送成功"
// @Router /is_block [get]
func IsBlock(c *gin.Context) {
	userId, err := strconv.Atoi(c.Query("user_id"))
	if err != nil {
		Response(Error(err.Error()))
	}
	auth := c.MustGet("auth").(*model.User)
	block, err := service.IsBlock(auth.Id, userId)
	if err != nil {
		Response(Error(err.Error()))
	}
	Response(Success("success", gin.H{
		"block": block,
	}))
}

// GetSpecifiedBlacks 获取指定黑名单信息
func GetSpecifiedBlacks(c *gin.Context) {

}

// UpdateFriends 批量更新好友信息
func UpdateFriends(c *gin.Context) {

}
